export default class Shape{
	constructor(){
		this.fontSize=10
	}
	point(p,ctx){
		p=p.assign()
		let type = p.type
		if(type==="cross"){
			this.crossPoint(p,ctx)
			return
		}
		let ratio = Math.pow(ctx.lineWidth/2,0.5)
		let ss = ctx.strokeStyle
		let fs = ctx.fillStyle
		let r = p.r
		ctx.save()
		
		ctx.fillStyle = ss
		ctx.strokeStyle = ss+"22"
		ctx.lineDash=[]
		ctx.lineWidth = ctx.ghost?10:1
		p.r=r+2
		this.circle(p,ctx)
		p.r=r+1
		ctx.fillStyle="#FFFFFF"
		this.circle(p,ctx)
		p.r=r-0.5
		ctx.fillStyle=ss
		this.circle(p,ctx)
		ctx.restore()
		if(ctx.ghost){
			ctx.save()
			this.drawLabel(p,ctx)
			ctx.restore()
		}
	}
	crossPoint(p,ctx){
		p=p.assign()
		let ss = ctx.strokeStyle
		let {x,y,r} = p
		let text = "✗"
		ctx.merge({
			fontSize	: 25,
			lineDash	: [],
			lineWidth	: 3,
			fillStyle 	: ss,
			strokeStyle : "#FFFFFF",
			textAlign 	: "center",
			textBaseline: "middle"
		})
		
		ctx.strokeText(text,p.x,p.y)
		ctx.lineWidth = 1
		ctx.strokeStyle = ss
		ctx.strokeText(text,p.x,p.y)
		ctx.fillText(text,p.x,p.y)
		ctx.restore()
	}
	drawLabel(p,ctx){
		let ss = ctx.strokeStyle
		let x = p.x+(p.r+5)
		let y = p.y-(p.r+10)
		ctx.merge({
			// fontSize	: 16,
			lineDash	: [],
			lineWidth	: 3,
			fillStyle 	: ss,
			strokeStyle : "#FFFFFF",
			textAlign 	: "center"
		})
		ctx.strokeText(p.text,x,y)
		ctx.lineWidth = 1
		ctx.strokeStyle = ss
		ctx.strokeText(p.text,x,y)
		ctx.fillText(p.text,x,y)
	}
	polyline1(ps,ctx,ms){
		for(let i=0;i<ms;i++){
			let _ps = ps.map(p=>{
				return p[i]||p[0]
			})
			this.polyline(_ps,ctx)
		}
	}
	dotline(ps,ctx){
		ctx.save()
		ctx.lineDash=[]
		ctx.lineWidth = 2
		ps.forEach(p=>{
			ctx.beginPath()
			ctx.moveTo(p.x,p.y)
			ctx.lineTo(p.x+1,p.y+1)
			ctx.stroke()
		})
		ctx.restore()
	}
	baseLine(fp,ctx,dim){
		let {x,y,a}=fp
		ctx.save()
		ctx.translate(x,y)
		ctx.rotate(a)
		this.linend(dim,ctx)
		ctx.restore()
	}
	line(pos,ctx){
		let dim = this.dim()
		this.baseLine(pos,ctx,[{x:-dim,y:0},{x:dim,y:0}])
	}
	ray(pos,ctx){
		let dim = this.dim()
		this.baseLine(pos,ctx,[{x:0,y:0},{x:dim,y:0}])
	}
	linend(step,ctx){
		let fp = step[0]
		let sp = step[1]
		ctx.beginPath()
		ctx.moveTo(fp.x,fp.y)
		ctx.lineTo(sp.x,sp.y)
		ctx.stroke();
	}
	vline(step,ctx){
		ctx.save()
		ctx.lineWidth=1
		ctx.lineDash=[2]
		this.linend(step,ctx)
		ctx.restore()
	}
	polyline(step,ctx){
		let fp = step[0]
		ctx.beginPath()
		ctx.moveTo(fp.x,fp.y)
		for(let i =1;i<step.length;i++)
			ctx.lineTo(step[i].x,step[i].y)
		ctx.stroke();
	}
	polygon(step,ctx){
		let fp = step[0]
		ctx.beginPath()
		ctx.moveTo(fp.x,fp.y)
		for(let i =1;i<step.length;i++)
			ctx.lineTo(step[i].x,step[i].y)
		ctx.closePath()
		ctx.fill()
		ctx.stroke();
	}
	points(step,ctx){
		step.forEach(p=>this.point(p,ctx))
	}
	rect(p,ctx){
		ctx.beginPath()
		let {x,y,w,h} = p
		ctx.fillRect(x,y,w,h)
		ctx.strokeRect(x,y,w,h);
		ctx.closePath()
	}
	cArc(p,ctx){
		ctx.beginPath()
		ctx.moveTo(p.x,p.y)
		this.arc(p,ctx)
		ctx.fill()
		ctx.closePath()
		ctx.stroke()
	}
	circle(p,ctx){
		ctx.beginPath()
		this.arc(p,ctx)
		ctx.fill()
		ctx.closePath()
		ctx.stroke()
	}
	arc(p,ctx){
		ctx.arc(
			p.x,
			p.y,
			p.r,
			p.s,
			p.e,
			p.at)
	}
	ellipse(p,ctx){
		ctx.beginPath()
		ctx.ellipse(
			p.x,
			p.y,
			p.r1,
			p.r2,
			0,
			p.s,
			p.e,
			p.at)
		ctx.fill()
		ctx.closePath()
		ctx.stroke()
	}
	drawRTip(step,ctx,vline){
		let fp = step[0]
		let sp = step[1]
		if(vline)
			this.vline(step,ctx)
		let r = Math.distance(fp,sp)
		let s = Math.tan360(sp.y-fp.y,sp.x-fp.x)
		ctx.save()
		ctx.fillStyle = ctx.strokeStyle
		ctx.fontSize=this.fontSize
		ctx.textAlign="center"
		ctx.translate(fp.x,fp.y)
		ctx.rotate(s)
		ctx.translate(r/2,0)
		r = (r/(ctx.ratio*ctx.zoom)).toFixed(2)
		ctx.fillText(`${r}`,0,-10)
		ctx.restore()
	}
	drawVRTip(step,ctx,vline){
		let fp = step[0]
		let sp = step[1]
		if(vline)
			this.vline(step,ctx)
		let r = sp.y-fp.y
		
		ctx.save()
		ctx.fillStyle = ctx.strokeStyle
		ctx.fontSize=this.fontSize
		ctx.textAlign="left"
		ctx.translate(fp.x,fp.y)
		ctx.translate(0,r/2)
		r = (r/(ctx.ratio*ctx.zoom)).toFixed(2)
		ctx.fillText(`${Math.abs(r)}`,5,0)
		ctx.restore()
	}
	drawHRTip(step,ctx,vline){
		let fp = step[0]
		let sp = step[1]
		if(vline)
			this.vline(step,ctx)
		let r = sp.x-fp.x
		
		ctx.save()
		ctx.fillStyle = ctx.strokeStyle
		ctx.fontSize=this.fontSize
		ctx.textAlign="center"
		ctx.translate(fp.x,fp.y)
		ctx.translate(r/2,0)
		r = (r/(ctx.ratio*ctx.zoom)).toFixed(2)
		ctx.fillText(`${Math.abs(r)}`,0,-10)
		ctx.restore()
	}
	dim(){
		let {width,height} = document.pageRect()
		return Math.dim(width,height)
	}
}